public class Solution {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Set<List<Integer>> sets = new HashSet<>();
        int len = nums.length;
        int[] n = new int[len];
        int pw = (int) Math.pow(2, len);
        for(int i = 0; i < pw; i++) {
            List<Integer> list = new ArrayList<>();
            for(int j = 0; j < len; j++) {
                if(n[j] == 1) {
                    list.add(nums[j]);
                }
            }
            list.sort((i1, i2) -> i1 - i2);
            sets.add(list);
            change(n, len);
        }
        return new ArrayList<>(sets);
    }

    private void change(int[] n, int len) {
        for(int i = 0; i < len; i++) {
            if(n[i] == 1) {
                n[i] = 0;
            } else {
                n[i] = 1;
                break;
            }
        }
    }
}